package persistencia.carreras.ensambladores;

import compartido.IEntidad;
import compartido.ITransaccion;

import modelo.controles.Control;
import modelo.geometria.Figura;
import modelo.geometria.Vector;
import modelo.obstaculos.Obstaculo;
import modelo.seniales.ISenial;

import persistencia.IAlmacen;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.carreras.ensambladores.general.ArmadorFiguras;
import persistencia.compartido.ArmadorReferencias;

public class EnsambladorComun {
	IAlmacen almacen;
	ArmadorFiguras figuras;
	ArmadorReferencias referencias;
	
	public EnsambladorComun(IAlmacen almacen) {
		this.almacen = almacen;
		this.figuras = ArmadorFiguras.getInstancia();
		this.referencias = ArmadorReferencias.getInstancia();
	}
	
	public IIngrediente armarIngrediente (String nombre, double valor) {
		return almacen.crearIngrediente(nombre, Double.toString(valor));
	}
	
	public IIngrediente armarIngrediente (String nombre, int valor) {
		return almacen.crearIngrediente(nombre, Integer.toString(valor));
	}

	public IIngrediente armarIngrediente (String nombre, boolean valor) {
		return almacen.crearIngrediente(nombre, Boolean.toString(valor));
	}
	
	public IIngrediente armarIngrediente (String nombre, Object valor) {
		return almacen.crearIngrediente(nombre, valor.toString());
	}
	
	public void alterarIngrediente(IProducto p, IIngrediente ingrediente) {
		if (!p.modificar(ingrediente))
			p.agregar(ingrediente);
	}
	
	public void armarTransaccion(IProducto p, ITransaccion t) {
		IIngrediente prioridad = armarIngrediente(Campos.prioridad, t.getPrioridad());
		alterarIngrediente(p, prioridad);
	}

	public void armarPosicion(IProducto p, Vector pos, String prefijo) {
		alterarIngrediente(p, armarIngrediente(Campos.prefijar(prefijo)+Campos.x, pos.getX()) );
		alterarIngrediente(p, armarIngrediente(Campos.prefijar(prefijo)+Campos.y, pos.getY()) );
	}
	
	public void armarFigura(IProducto p, Figura f, String campo) {
		String valor = figuras.escribirFigura(f);
		alterarIngrediente(p, armarIngrediente(campo, valor));
	}
	
	public void armarObstaculo(IProducto p, Obstaculo o) {
		armarFigura(p, o.getCuerpo(), Campos.vision);
	}
	
	public void armarSenial(IProducto p, ISenial senial) {
		String refSenial = "";
		if (senial instanceof IEntidad)
			refSenial = referencias.escribirReferencia((IEntidad)senial);
		alterarIngrediente(p, armarIngrediente(Campos.senial, refSenial));
	}
	
	public void armarControl(IProducto p, Control c) {
		armarTransaccion(p,c);
		armarFigura(p,c.getCuerpo(),Campos.cuerpo);
		armarFigura(p,c.getVision(),Campos.vision);
		armarSenial(p,c.getSenial());
		//IIngrediente senial = almacen.crearIngrediente("senial", c.getSenial().getIdentificador())
	}

}
